home *** CD-ROM | disk | FTP | other *** search
- /*----------------------------------------------------------------------------
-
- resutil.c
-
- This reusable module contains miscellaneous Resource Manager utility routines.
-
- Copyright © 1994, Northwestern University.
-
- ----------------------------------------------------------------------------*/
-
- #include "resutil.h"
- #include "memutil.h"
- #include "strutil.h"
- #include "fileutil.h"
-
-
-
- /*----------------------------------------------------------------------------
- MyFSpOpenResFile
-
- Open a resource file.
-
- Entry: fSpec = pointer to file spec.
- permission = open permissions.
-
- Exit: function result = error code.
- *refNum = reference number of opened file.
- ----------------------------------------------------------------------------*/
-
- OSErr MyFSpOpenResFile (FSSpec *fSpec, SignedByte permission, short *refNum)
- {
- short fRefNum;
- OSErr err = noErr;
-
- fRefNum = FSpOpenResFile(fSpec, permission);
- err = ResError();
- if (err != noErr) return err;
- *refNum = fRefNum;
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyFSpCreateResFile
-
- Create a resource file.
-
- Entry: fSpec = pointer to file spec.
- creator = creator code.
- fileType = file type.
- scriptTag = script code.
-
- Exit: function result = error code.
- *refNum = reference number of opened file.
- ----------------------------------------------------------------------------*/
-
- OSErr MyFSpCreateResFile (FSSpec *fSpec, OSType creator, OSType fileType,
- ScriptCode scriptTag)
- {
- FSpCreateResFile(fSpec, creator, fileType, scriptTag);
- return ResError();
- }
-
-
-
- /*----------------------------------------------------------------------------
- OpenResFileWriteCreateIfMissing
-
- Open a resource file for writing. Create the file if it doesn't exist.
-
- Entry: fSpec = pointer to file spec.
- creator = creator code.
- fileType = file type.
- scriptTag = script code.
-
- Exit: function result = error code.
- *refNum = reference number of opened file.
- ----------------------------------------------------------------------------*/
-
- OSErr OpenResFileWriteCreateIfMissing (FSSpec *fSpec, OSType creator, OSType fileType,
- ScriptCode scriptTag, short *refNum)
- {
- short fRefNum = 0;
- OSErr err = noErr;
-
- err = MyFSpOpenResFile(fSpec, fsRdWrPerm, &fRefNum);
- if (err == fnfErr || err == eofErr) {
- err = MyFSpCreateResFile(fSpec, creator, fileType, scriptTag);
- if (err != noErr) return err;
- err = MyFSpOpenResFile(fSpec, fsRdWrPerm, &fRefNum);
- if (err != noErr) return err;
- } else if (err != noErr) {
- return err;
- }
- *refNum = fRefNum;
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyGetResource
-
- Get a resource.
-
- Entry: rType = resource type.
- rID = resource id.
-
- Exit: function result = error code.
- *theHandle = handle to resource.
- ----------------------------------------------------------------------------*/
-
- OSErr MyGetResource (OSType rType, short rID, void *theHandle)
- {
- Handle h;
- OSErr err = noErr;
-
- h = GetResource(rType, rID);
- err = ResError();
- if (err != noErr) return err;
- if (h == nil) return resNotFound;
- *(void**)theHandle = h;
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyGet1Resource
-
- Get a resource.
-
- Entry: rType = resource type.
- rID = resource id.
-
- Exit: function result = error code.
- *theHandle = handle to resource.
- ----------------------------------------------------------------------------*/
-
- OSErr MyGet1Resource (OSType rType, short rID, void *theHandle)
- {
- Handle h;
- OSErr err = noErr;
-
- h = Get1Resource(rType, rID);
- err = ResError();
- if (err != noErr) return err;
- if (h == nil) return resNotFound;
- *(void**)theHandle = h;
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyGet1IndResource
-
- Get an indexed resource.
-
- Entry: rType = resource type.
- index = resource index.
-
- Exit: function result = error code.
- *theHandle = handle to resource.
- ----------------------------------------------------------------------------*/
-
- OSErr MyGet1IndResource (OSType rType, short index, void *theHandle)
- {
- Handle h;
- OSErr err = noErr;
-
- h = Get1IndResource(rType, index);
- err = ResError();
- if (err != noErr) return err;
- if (h == nil) return resNotFound;
- *(void**)theHandle = h;
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyAddResource
-
- Add a resource.
-
- Entry: rType = resource type.
- rID = resource id.
- theHandle = handle to data.
- rName = resource name.
-
- Exit: function result = error code.
- ----------------------------------------------------------------------------*/
-
- OSErr MyAddResource (void *theHandle, OSType rType, short rID,
- ConstStr255Param rName)
- {
- AddResource(theHandle, rType, rID, rName);
- return ResError();
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyReplaceResource
-
- Replace a resource. Create it if it doesn't already exist.
-
- Entry: theHandle = handle to data.
- rType = resource type.
- rID = resource id.
- rName = resource name.
-
- Exit: function result = error code.
- ----------------------------------------------------------------------------*/
-
- OSErr MyReplaceResource (void *theHandle, OSType rType, short rID,
- ConstStr255Param rName)
- {
- OSErr err = noErr;
- Handle h;
-
- SetResLoad(false);
- err = MyGet1Resource(rType, rID, &h);
- SetResLoad(true);
- if (err == noErr) {
- SetResInfo(h, Unique1ID(rType), nil);
- err = MyAddResource(theHandle, rType, rID, rName);
- if (err == noErr) {
- RemoveResource(h);
- MyDisposeHandle(h);
- return noErr;
- } else {
- SetResInfo(h, rID, nil);
- return err;
- }
- } else if (err == resNotFound) {
- return MyAddResource(theHandle, rType, rID, rName);
- } else {
- return err;
- }
- }
- /*
- OSErr MyReplaceResource (void *theHandle, OSType rType, short rID,
- ConstStr255Param rName)
- {
- OSErr err = noErr;
- Handle h;
-
- SetResLoad(false);
- err = MyGet1Resource(rType, rID, &h);
- SetResLoad(true);
- if (err == noErr) {
- RemoveResource(h);
- MyDisposeHandle(h);
- } else if (err != resNotFound) {
- return err;
- }
- return MyAddResource(theHandle, rType, rID, rName);
- }
- */
-
-
-
- /*----------------------------------------------------------------------------
- MyReleaseResource
-
- Release a resource.
-
- Entry: rHandle = handle to resource.
- ----------------------------------------------------------------------------*/
-
- void MyReleaseResource (void *rHandle)
- {
- ReleaseResource(rHandle);
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyDetachResource
-
- Detach a resource.
-
- Entry: rHandle = handle to resource.
- ----------------------------------------------------------------------------*/
-
- void MyDetachResource (void *rHandle)
- {
- DetachResource(rHandle);
- }
-
-
-
- /*----------------------------------------------------------------------------
- WriteProgramNameResource
-
- Write the program name resource (STR id=-16396) to the current resource
- file. See IM VI p. 9-21.
-
- Entry: index = index in STR# id=128 resource of program name string.
-
- Exit: function result = error code.
- ----------------------------------------------------------------------------*/
-
- OSErr WriteProgramNameResource (short index)
- {
- Handle h;
- Str255 progName;
- OSErr err = noErr;
-
- GetPString(index, progName);
- err = MyPtrToHand(progName, &h, *progName + 1);
- if (err != noErr) return err;
- return MyReplaceResource(h, 'STR ', -16396, "\p");
- }
-
-
-
- /*----------------------------------------------------------------------------
- GetVersionString
-
- Get the version number string from the current resource file.
-
- Exit: function result = error code.
- versString = P-format version number string.
- ----------------------------------------------------------------------------*/
-
- OSErr GetVersionString (Str255 versString)
- {
- OSErr err = noErr;
- Handle vers1Resource;
-
- err = MyGet1Resource('vers', 1, &vers1Resource);
- if (err != noErr) return err;
- CopyPascalString(versString, (StringPtr)(*vers1Resource+6));
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- GetVersionNumber
-
- Get the version number from the current resource file.
-
- Exit: function result = error code.
- *versNumber = version number.
- ----------------------------------------------------------------------------*/
-
- OSErr GetVersionNumber (unsigned long *versNumber)
- {
- OSErr err = noErr;
- Handle vers1Resource;
-
- err = MyGet1Resource('vers', 1, &vers1Resource);
- if (err != noErr) return err;
- *versNumber = **(unsigned long**)vers1Resource;
- return noErr;
- }
-
-
-
- /*----------------------------------------------------------------------------
- MyCloseResFile
-
- Close a resource file.
-
- Entry: fRefNum = file reference number.
-
- Exit: function result = error code.
- ----------------------------------------------------------------------------*/
-
- void MyCloseResFile (short fRefNum)
- {
- short vRefNum;
- OSErr err = noErr;
-
- err = GetFileVolRefNum(fRefNum, &vRefNum);
- CloseResFile(fRefNum);
- if (err == noErr) FlushVol(nil, vRefNum);
- }